package negocio;

import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.swing.JOptionPane;

import com.sun.codemodel.JOp;

import daos.AutomovilDAO;
import daos.ColorDAO;
import daos.FechaDAO;
import daos.MarcaDAO;
import daos.ModeloDAO;
import daos.SubastaDAO;
import daos.TipoSubastaDAO;
import daos.UsuarioDAO;
import datos.Automovil;
import datos.Color;
import datos.Fecha;
import datos.Marca;
import datos.Modelo;
import datos.Persona;
import datos.Subasta;
import datos.TipoSubasta;
import datos.Usuario;

/**
 * Session Bean implementation class EJBSubastas
 */
@Stateless
@LocalBean
public class EJBSubastas implements EJBSubastasRemote {

	@EJB 
	MarcaDAO marcaDao;
	@EJB 
	ModeloDAO modeloDao;
	
	@EJB
	ColorDAO colorDao;
	
	@EJB
	AutomovilDAO automovilDao;
	
	@EJB
	SubastaDAO subastaDao;
	
	@EJB
	TipoSubastaDAO tipoSubastaDAO;
	
	@EJB
	UsuarioDAO usuarioDAO;
	
	@EJB
	FechaDAO fechaDAO;
	
	String respuesta;
    /**
     * Default constructor. 
     */
    public EJBSubastas() 
    {
        // TODO Auto-generated constructor stub
    }
    
	

	public void crearAutomovil(String placa, Modelo modelo, Color color) 
	{
		
		Automovil automovil=new Automovil();
		automovil.setColor(color);
		automovil.setModelo(modelo);
		automovil.setPlaca(placa);
		
		
		//se verifica que no exista un automovil con la misma placa
		//que exista la marca y si no existe se agrega
		//que exista el modelo, si no existe se agrega
		
		if (automovilDao.findByKey(placa)==null) 
		{
			if (marcaDao.findByKey(modelo.getMarca().getNombre())!=null) 
			{
				if (modeloDao.findByKey(modelo.getNombre())!=null) 
				{
					if(colorDao.findByKey(automovil.getColor().getIdentificador())!=null)
					{
						automovilDao.insert(automovil);
					}
					else
					{
						colorDao.insert(color);
						automovilDao.insert(automovil);
					}
				}	
				else 
				{
					
					modeloDao.insert(modelo);
					if(colorDao.findByKey(automovil.getColor().getIdentificador())!=null)
					{
						automovilDao.insert(automovil);
					}
					else
					{
						colorDao.insert(color);
						automovilDao.insert(automovil);
					}

				}
				
			}
			else
			{
				marcaDao.insert(modelo.getMarca());
				if (modeloDao.findByKey(modelo.getNombre())!=null)
				{
					if(colorDao.findByKey(automovil.getColor().getIdentificador())!=null)
					{
						automovilDao.insert(automovil);
					}
					else
					{
						colorDao.insert(color);
						automovilDao.insert(automovil);
					}	
				}
				else
					{
					modeloDao.insert(modelo);
					
					if(colorDao.findByKey(automovil.getColor().getIdentificador())!=null)
					{
						automovilDao.insert(automovil);
					}
					else
					{
						colorDao.insert(color);
						automovilDao.insert(automovil);
					}
					}
				
			}
		}
		else
		JOptionPane.showMessageDialog(null,"existe");
		
				
	}

	
	
	
	public String crearSubasta(int diaF, int mesF, int anioF,
			double precioBase, String tipoSubastaDes, String placa, String modeloNombre, String colorNombre, String usuarioId) 
	{
		Usuario usuario=usuarioDAO.findByKey(usuarioId);
		
		
		Modelo modelo=modeloDao.findByKey(modeloNombre);
		Color color=colorDao.getColor(colorNombre);
		
		Automovil automovil=new Automovil();
		automovil.setColor(color);
		automovil.setModelo(modelo);
		automovil.setPlaca(placa);
		
		Fecha fechaInicio=new Fecha();
		Date date=new Date();
    	int dia=date.getDate();
    	int mes=date.getMonth()+1;
    	int anio=date.getYear()+1900;
		fechaInicio.setDia(dia);
		fechaInicio.setMes(mes);
		fechaInicio.setAnio(anio);
		
		Fecha fechaFin=new Fecha();
		fechaFin.setDia(diaF);
		fechaFin.setMes(mesF);
		fechaFin.setAnio(anioF);
		
		TipoSubasta tipoSubasta=tipoSubastaDAO.getTipoSubasta(tipoSubastaDes);
		
		
		//
		Subasta subasta=new Subasta();
		subasta.setAutomovil(automovil);
		subasta.setFechaFin(fechaFin);
		subasta.setFechaInicio(fechaInicio);
		subasta.setPrecioBase(precioBase);
		subasta.setTipoSubasta(tipoSubasta);
		subasta.setUsuario(usuario);
		
		JOptionPane.showMessageDialog(null, automovil.getPlaca());
	
		if(usuarioDAO.findByKey(usuario.getCedula())==null)
		{
			usuarioDAO.insert(usuario);
		}
		
		if (automovilDao.findByKey(automovil.getPlaca())==null) 
		{
			JOptionPane.showMessageDialog(null, "no existe el carro");
			
			if (marcaDao.findByKey(automovil.getModelo().getMarca().getNombre())!=null) 
			{
				if (modeloDao.findByKey(automovil.getModelo().getNombre())!=null) 
				{
					if(colorDao.findByKey(automovil.getColor().getIdentificador())!=null)
					{
						automovilDao.insert(automovil);
						fechaDAO.insert(fechaInicio);
						fechaDAO.insert(fechaFin);
						subastaDao.insert(subasta);
						respuesta="ok";
					}
					else
					{
						colorDao.insert(automovil.getColor());
						fechaDAO.insert(fechaInicio);
						fechaDAO.insert(fechaFin);						
						automovilDao.insert(automovil);
						subastaDao.insert(subasta);
						respuesta="ok";
					}
				}	
				else 
				{
					
					modeloDao.insert(automovil.getModelo());
					if(colorDao.findByKey(automovil.getColor().getIdentificador())!=null)
					{
						automovilDao.insert(automovil);
						fechaDAO.insert(fechaInicio);
						fechaDAO.insert(fechaFin);
						subastaDao.insert(subasta);
						respuesta="ok";
					}
					else
					{
						colorDao.insert(automovil.getColor());
						fechaDAO.insert(fechaInicio);
						fechaDAO.insert(fechaFin);
						automovilDao.insert(automovil);
						subastaDao.insert(subasta);
						respuesta="ok";					
					}

				}
				
			}
			else
			{
				marcaDao.insert(automovil.getModelo().getMarca());
				if (modeloDao.findByKey(automovil.getModelo().getNombre())!=null)
				{
					if(colorDao.findByKey(automovil.getColor().getIdentificador())!=null)
					{
						automovilDao.insert(automovil);
						fechaDAO.insert(fechaInicio);
						fechaDAO.insert(fechaFin);
						subastaDao.insert(subasta);
						respuesta="ok";
					}
					else
					{
						colorDao.insert(automovil.getColor());
						automovilDao.insert(automovil);
						fechaDAO.insert(fechaInicio);
						fechaDAO.insert(fechaFin);
						subastaDao.insert(subasta);
						respuesta="ok";
					}	
				}
				else
					{
					modeloDao.insert(automovil.getModelo());
					
					if(colorDao.findByKey(automovil.getColor().getIdentificador())!=null)
					{
						automovilDao.insert(automovil);
						fechaDAO.insert(fechaInicio);
						fechaDAO.insert(fechaFin);
						subastaDao.insert(subasta);
						respuesta="ok";
					}
					else
					{
						colorDao.insert(automovil.getColor());
						automovilDao.insert(automovil);
						fechaDAO.insert(fechaInicio);
						fechaDAO.insert(fechaFin);
						subastaDao.insert(subasta);
						respuesta="ok";
					}
					}
				
			}
		}
			else
			{
				JOptionPane.showMessageDialog(null, "existe el carro");
				
				List<Subasta>subastas=subastaDao.getAll();
				
				Date date1=new Date();
		    	int dia1=date.getDate();
		    	int mes1=date.getMonth()+1;
		    	int anio1=date.getYear()+1900;
		    	
				    	
		    	if (subastas.size()==0) 
		    	{
		    		JOptionPane.showMessageDialog(null, subastas.size());
		    		fechaDAO.insert(fechaInicio);
		    		fechaDAO.insert(fechaFin);
	    			subastaDao.insert(subasta);
	    			respuesta="ok";
		    	}
		    	else
		    	{
						for (int i = 0; i < subastas.size(); i++) 
						{
						if (subastas.get(i).getAutomovil().getPlaca().equals(automovil.getPlaca()))
						{
							if (anio1==subastas.get(i).getFechaFin().getAnio())
							{
								if(mes==subastas.get(i).getFechaFin().getMes())
								{
									if(dia>subastas.get(i).getFechaFin().getDia())
									{
										fechaDAO.insert(fechaInicio);
							    		fechaDAO.insert(fechaFin);
										subastaDao.insert(subasta);	
										respuesta="ok";
									}
									else
									{
										JOptionPane.showMessageDialog(null,"Ya existe una subasta con este automovil");
										respuesta="no";
									}
									//sino se mostrara un error donde indique que el automovil ya esta siendo
									//subastado
								}
								else
								{
									if(mes>subastas.get(i).getFechaFin().getMes())
									{
										fechaDAO.insert(fechaInicio);
							    		fechaDAO.insert(fechaFin);
										subastaDao.insert(subasta);
										respuesta="ok";
									}else
										respuesta="no";
									//sino se mostrara un error donde indique que el automovil ya esta siendo
									//subastado
								}
							} 
							else
							{
								if(anio>subastas.get(i).getFechaFin().getAnio())
								{
									fechaDAO.insert(fechaInicio);
						    		fechaDAO.insert(fechaFin);
									subastaDao.insert(subasta);
									respuesta="ok";
								}else
									respuesta="no";
								//sino se mostrara un error donde indique que el automovil ya esta siendo
								//subastado
							}
					    	
							
						}else {
							fechaDAO.insert(fechaInicio);
				    		fechaDAO.insert(fechaFin);
							subastaDao.insert(subasta);
							respuesta="ok";
						}
							
					}
				}
			}
		return respuesta;
	}

	@Override
	public void crearOferta(int identificacion, double valorOfertado,
			Fecha fecha, Usuario usuario, Subasta subasta) {
		// TODO se va a verificar que en una subasta no exista mas de una oferta de un mismo cliente
		//y que la subasta a la que intenta hacer la oferta se encuentre activa
		
	}

	@Override
	public List<String> getNombreMarcas() {
		
		return marcaDao.NombresMarca();
	}
	
	public List<String> getModelosMarca(String marca)
	{
		return marcaDao.modelosMarca(marca);
	}
	
	public List<String> getListaColores()
	{
		return colorDao.colorNombre();
	}

	public List<String> getListaTipoSubasta()
	{
		return tipoSubastaDAO.tipoSubastaNombre();
	}
	public String[][] getSubastasPorPrecio(double desde, double hasta)
	{
		return subastaDao.AutosPorPrecio(desde, hasta);
	}
	public String[][] getSubastasPorPrecioyModelo(double precio,String modelo)
	{
		return subastaDao.subastaPrecioModelo(precio, modelo );
	}
	public String[][] getSubastasUsuario(String id)
	{
		return subastaDao.subastasUsuario(id);
	}
	public String[][] getOfertasSubasta(int id)
	{
		String ofertas[][]=new String[][]{{}};
		Subasta subasta=subastaDao.findByKey(id);
		String tpoSubasta=subasta.getTipoSubasta().getDescripcion();
		
		if (tpoSubasta.equals("dinamica")) {
			ofertas=subastaDao.OfertasSubastas(id);
		}
		
		return ofertas;
	}

	  	
    
}
